﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.Drawing;

namespace TARLib
{
    public class ComandaSimple : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        public ComandaSimple(int comandaID, string codiceComanda, bool isCheckInRichiesto, bool isStampaRemotaRichiesta, bool isConsegnaRichiesta, DateTime dataOraComanda, DateTime? dataOraEliminazione, DateTime? dataOraCheckIn, DateTime? dataOraStampaRemota, DateTime? dataOraConsegna)
        {
            ComandaID = comandaID;
            CodiceComanda = codiceComanda;
            IsCheckInRichiesto = isCheckInRichiesto;
            IsStampaRemotaRichiesta = isStampaRemotaRichiesta;
            IsConsegnaRichiesta = isConsegnaRichiesta;
            DataOraComanda = dataOraComanda;
            DataOraEliminazione = dataOraEliminazione;
            DataOraCheckIn = dataOraCheckIn;
            DataOraStampaRemota = dataOraStampaRemota;
            DataOraConsegna = dataOraConsegna;
        }

        #region Proprietà
        private int _ComandaID;
        public int ComandaID
        {
            get
            {
                return _ComandaID;
            }
            set
            {
                _ComandaID = value;
                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs("ComandaID"));
                    PropertyChanged(this, new PropertyChangedEventArgs("DescriptionTooltip"));
                }
            }
        }

        private string _CodiceComanda;
        public string CodiceComanda
        {
            get
            {
                return _CodiceComanda;
            }
            set
            {
                _CodiceComanda = value;
                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs("CodiceComanda"));
                    PropertyChanged(this, new PropertyChangedEventArgs("DescriptionTooltip"));
                }
            }
        }

        private bool _IsCheckInRichiesto;
        public bool IsCheckInRichiesto
        {
            get
            {
                return _IsCheckInRichiesto;
            }
            set
            {
                _IsCheckInRichiesto = value;
                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs("IsCheckInRichiesto"));
                    PropertyChanged(this, new PropertyChangedEventArgs("StatusColor"));
                    PropertyChanged(this, new PropertyChangedEventArgs("DescriptionTooltip"));
                }
            }
        }

        private bool _IsStampaRemotaRichiesta;
        public bool IsStampaRemotaRichiesta
        {
            get
            {
                return _IsStampaRemotaRichiesta;
            }
            set
            {
                _IsStampaRemotaRichiesta = value;
                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs("IsStampaRemotaRichiesta"));
                    PropertyChanged(this, new PropertyChangedEventArgs("StatusColor"));
                    PropertyChanged(this, new PropertyChangedEventArgs("DescriptionTooltip"));
                }
            }
        }

        private bool _IsConsegnaRichiesta;
        public bool IsConsegnaRichiesta
        {
            get
            {
                return _IsConsegnaRichiesta;
            }
            set
            {
                _IsConsegnaRichiesta = value;
                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs("IsConsegnaRichiesta"));
                    PropertyChanged(this, new PropertyChangedEventArgs("StatusColor"));
                    PropertyChanged(this, new PropertyChangedEventArgs("DescriptionTooltip"));
                }
            }
        }

        private DateTime _DataOraComanda;
        public DateTime DataOraComanda
        {
            get
            {
                return _DataOraComanda;
            }
            set
            {
                _DataOraComanda = value;
                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs("DataOraComanda"));
                    PropertyChanged(this, new PropertyChangedEventArgs("StatusColor"));
                    PropertyChanged(this, new PropertyChangedEventArgs("DescriptionTooltip"));
                }
            }
        }

        private DateTime? _DataOraEliminazione;
        public DateTime? DataOraEliminazione
        {
            get
            {
                return _DataOraEliminazione;
            }
            set
            {
                _DataOraEliminazione = value;
                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs("DataOraEliminazione"));
                    PropertyChanged(this, new PropertyChangedEventArgs("StatusColor"));
                    PropertyChanged(this, new PropertyChangedEventArgs("DescriptionTooltip"));
                }
            }
        }

        private DateTime? _DataOraCheckIn;
        public DateTime? DataOraCheckIn
        {
            get
            {
                return _DataOraCheckIn;
            }
            set
            {
                _DataOraCheckIn = value;
                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs("DataOraCheckIn"));
                    PropertyChanged(this, new PropertyChangedEventArgs("StatusColor"));
                    PropertyChanged(this, new PropertyChangedEventArgs("DescriptionTooltip"));
                }
            }
        }

        private DateTime? _DataOraStampaRemota;
        public DateTime? DataOraStampaRemota
        {
            get
            {
                return _DataOraStampaRemota;
            }
            set
            {
                _DataOraStampaRemota = value;
                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs("DataOraStampaRemota"));
                    PropertyChanged(this, new PropertyChangedEventArgs("StatusColor"));
                    PropertyChanged(this, new PropertyChangedEventArgs("DescriptionTooltip"));
                }
            }
        }

        private DateTime? _DataOraConsegna;
        public DateTime? DataOraConsegna
        {
            get
            {
                return _DataOraConsegna;
            }
            set
            {
                _DataOraConsegna = value;
                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs("DataOraConsegna"));
                    PropertyChanged(this, new PropertyChangedEventArgs("StatusColor"));
                    PropertyChanged(this, new PropertyChangedEventArgs("DescriptionTooltip"));
                }
            }
        }
        #endregion

        #region Proprietà calcolate
        public StatoComanda StatoCorrente
        {
            get
            {
                if (DataOraEliminazione.HasValue)
                    return StatoComanda.NessunoStato;
                else if (!IsCheckInRichiesto && !IsStampaRemotaRichiesta && !IsConsegnaRichiesta)
                    return StatoComanda.SalvataggioEffettuato;
                else if (IsCheckInRichiesto && !DataOraCheckIn.HasValue && !DataOraStampaRemota.HasValue & !DataOraConsegna.HasValue)
                    return StatoComanda.InAttesaDiCheckIn;
                else if (IsCheckInRichiesto && !DataOraCheckIn.HasValue && !IsStampaRemotaRichiesta && !IsConsegnaRichiesta)
                    return StatoComanda.CheckInEffettuato;
                else if (IsStampaRemotaRichiesta && !DataOraStampaRemota.HasValue && !DataOraConsegna.HasValue)
                    return StatoComanda.InAttesaDiStampaRemota;
                else if (IsStampaRemotaRichiesta && !DataOraStampaRemota.HasValue && !IsConsegnaRichiesta)
                    return StatoComanda.StampaRemotaEffettuata;
                else if (IsConsegnaRichiesta && !DataOraConsegna.HasValue)
                    return StatoComanda.InAttesaDiConsegna;
                else if (IsConsegnaRichiesta && DataOraConsegna.HasValue)
                    return StatoComanda.ConsegnaEffettuata;
                else return StatoComanda.NessunoStato;
            }
        }

        public StatoComanda StatoSuccessivo
        {
            get
            {
                if (DataOraEliminazione.HasValue)
                    return StatoComanda.NessunoStato;
                else
                {
                    switch (StatoCorrente)
                    {
                        case StatoComanda.InAttesaDiSalvataggio:
                            if (IsCheckInRichiesto)
                                return StatoComanda.InAttesaDiCheckIn;
                            else if (IsStampaRemotaRichiesta)
                                return StatoComanda.InAttesaDiStampaRemota;
                            else if (IsConsegnaRichiesta)
                                return StatoComanda.InAttesaDiConsegna;
                            else
                                return StatoComanda.SalvataggioEffettuato;
                        case StatoComanda.SalvataggioEffettuato:
                            return StatoComanda.NessunoStato;
                        case StatoComanda.InAttesaDiCheckIn:
                            if (IsStampaRemotaRichiesta)
                                return StatoComanda.InAttesaDiStampaRemota;
                            else if (IsConsegnaRichiesta)
                                return StatoComanda.InAttesaDiConsegna;
                            else
                                return StatoComanda.CheckInEffettuato;
                        case StatoComanda.CheckInEffettuato:
                            return StatoComanda.NessunoStato;
                        case StatoComanda.InAttesaDiStampaRemota:
                            if (IsConsegnaRichiesta)
                                return StatoComanda.InAttesaDiConsegna;
                            else
                                return StatoComanda.StampaRemotaEffettuata;
                        case StatoComanda.StampaRemotaEffettuata:
                            return StatoComanda.NessunoStato;
                        case StatoComanda.InAttesaDiConsegna:
                            return StatoComanda.ConsegnaEffettuata;
                        case StatoComanda.ConsegnaEffettuata:
                            return StatoComanda.NessunoStato;
                        case StatoComanda.NessunoStato:
                            return StatoComanda.NessunoStato;
                        default:
                            return StatoComanda.NessunoStato;
                    }
                }
            }
        }
        #endregion

        #region Interface and binding
        public System.Windows.Media.SolidColorBrush StatusColor
        {
            get
            {

                switch (StatoCorrente)
                {
                    case StatoComanda.InAttesaDiSalvataggio:
                        return new System.Windows.Media.SolidColorBrush(System.Windows.Media.Colors.White);
                    case StatoComanda.SalvataggioEffettuato:
                        return new System.Windows.Media.SolidColorBrush(System.Windows.Media.Colors.GreenYellow);
                    case StatoComanda.InAttesaDiCheckIn:
                        return new System.Windows.Media.SolidColorBrush(System.Windows.Media.Colors.WhiteSmoke);
                    case StatoComanda.CheckInEffettuato:
                        return new System.Windows.Media.SolidColorBrush(System.Windows.Media.Colors.GreenYellow);
                    case StatoComanda.InAttesaDiStampaRemota:
                        return new System.Windows.Media.SolidColorBrush(System.Windows.Media.Colors.Yellow);
                    case StatoComanda.StampaRemotaEffettuata:
                        return new System.Windows.Media.SolidColorBrush(System.Windows.Media.Colors.GreenYellow);
                    case StatoComanda.InAttesaDiConsegna:
                        return new System.Windows.Media.SolidColorBrush(System.Windows.Media.Colors.LightBlue);
                    case StatoComanda.ConsegnaEffettuata:
                        return new System.Windows.Media.SolidColorBrush(System.Windows.Media.Colors.GreenYellow);
                    case StatoComanda.NessunoStato:
                        return new System.Windows.Media.SolidColorBrush(System.Windows.Media.Colors.Gray);
                    default:
                        return new System.Windows.Media.SolidColorBrush(System.Windows.Media.Colors.Gray);
                }
            }
        }

        public string DescrizioneTooltip
        {
            get
            {
                return String.Format("Comanda: {0}\nCodice: {1}\nCreata il: {2:dd/MM/yyyy HH:mm}\nCheck-in: {3:HH:mm:ss}\nStampa: {4:HH:mm:ss}\nConsegna: {5:HH:mm:ss}\nAnnullata: {6:HH:mm:ss}", this.ComandaID, this.CodiceComanda, this.DataOraComanda, this.DataOraCheckIn, this.DataOraStampaRemota, this.DataOraConsegna, this.DataOraEliminazione);
            }
        }
        #endregion

        #region Metodi
        public void Refresh()
        {
            // Carica la comanda e "rinfresca" le proprietà
            Comanda comandaAssociata = new Comanda(this.ComandaID);
            this.IsCheckInRichiesto = comandaAssociata.IsCheckInRichiesto;
            this.IsStampaRemotaRichiesta = comandaAssociata.IsStampaRemotaRichiesta;
            this.IsConsegnaRichiesta = comandaAssociata.IsConsegnaRichiesta;
            this.DataOraComanda = comandaAssociata.DataOra;
            // TODO: associare l'eliminazione
            // this.DataOraEliminazione = comandaAssociata.
            this.DataOraCheckIn = comandaAssociata.CheckInAssociato == null ? null : (DateTime?)comandaAssociata.CheckInAssociato.DataOra;
            this.DataOraStampaRemota = comandaAssociata.StampaRemotaAssociata == null ? null : (DateTime?)comandaAssociata.StampaRemotaAssociata.DataOra;
            this.DataOraConsegna = comandaAssociata.ConsegnaAssociata == null ? null : (DateTime?)comandaAssociata.ConsegnaAssociata.DataOra;
        }
        #endregion
    }
}
